package sort;

import java.util.Arrays;

public class Merge {
    /**
     * 辅助数组
     */
    private static Comparable[] assist;

    public static void sort(Comparable[] a) {
        // 初始化
        assist = new Comparable[a.length];
        int lo = 0;
        int hi = a.length - 1;
        sort(a, lo, hi);

    }

    /**
     * 对数组 lo 到 li 的元素进行排序
     */
    private static void sort(Comparable[] a, int lo, int hi) {
        if (hi <= lo) {
            return;
        }

        int mid = lo + (hi - lo) / 2;
        // 递归拆
        sort(a, lo, mid);
        sort(a, mid + 1, hi);
        // 有序合
        merge(a, lo, mid, hi);
    }

    /**
     * 对数组a  lo到mid  mid到hi 两个有序的子数组合并成 有序的大数组(lo,hi)
     */
    private static void merge(Comparable[] a, int lo, int mid, int hi) {
        int i = lo; // 指向assist数组,填充assist数组
        int p1 = lo; // 指向第一组数据
        int p2 = mid + 1; // 第二组
        while (p1 <= mid && p2 <= hi) {
            if (less(a[p1], a[p2])) {
                assist[i++] = a[p1++];
            } else {
                assist[i++] = a[p2++];
            }
        }
        // 第一组还没插入完 第二组已经插入完 继续插入
        while (p1 <= mid) {
            assist[i++] = a[p1++];
        }
        // 同理
        while (p2 <= hi) {
            assist[i++] = a[p2++];
        }

        // 到此 数组中 lo 到 hi 已经有序 更新到数组中
        if (hi + 1 - lo >= 0) System.arraycopy(assist, lo, a, lo, hi + 1 - lo);

    }


    private static boolean less(Comparable v, Comparable w) {
        return v.compareTo(w) < 0;
    }

    /**
     * 交换数组a 索引i 和 索引j 处的值
     */
    private static void exchange(Comparable[] a, int i, int j) {
        Comparable t = a[i];
        a[i] = a[j];
        a[j] = t;
    }

    public static void main(String[] args) {
        Integer[] a = {4, 6, 8, 7, 9, 2, 10, 1};
        Merge.sort(a);
        System.out.println(Arrays.toString(a));
    }
}
